iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0
Odoo

Odoo 14 Javascript 開發心路歷程系列 第 23

Day 23 Action client view 的 renderElement() - 底層基本面講述

  • 分享至 

  • xImage
  •  

首先,我們可以搜尋繼承的 abstractAction 的宣告,

各位也可以自行找到檔案,前後看一下是否有 renderElement()

// addons/web/static/src/js/chrome/abstract_action.js
var AbstractAction = Widget.extend(ActionMixin, {
    // ...
});

abstractAction 沒有找到 renderElement()

那繼續看 abstractAction 繼承的 ActionMixin 來往上尋找

// addons/web/static/src/js/chrome/action_mixin.js
const ActionMixin = Object.assign({}, WidgetAdapterMixin, {
    // ...
    renderElement: function () {
        this._super.apply(this, arguments);
        if (this.contentTemplate) {
            const content = core.qweb.render(this.contentTemplate, { widget: this });
            this.$('.o_content').append(content);
        }
    },
    // ...
});

有沒有發現關鍵字 this.contentTemplate

跳到對應的屬性,可以看到 Action 預設有一個 template Action ,並額外定義一個屬性 contentTemplate

// addons/web/static/src/js/chrome/action_mixin.js
const ActionMixin = Object.assign({}, WidgetAdapterMixin, {
    template: 'Action',

    /**
     * The action mixin assumes that it is rendered with the 'Action' template.
     * This template has a special zone ('.o_content') where the content should
     * be added.  Actions that want to automatically render a template there
     * should define the contentTemplate key.  In short, client actions should
     * probably define a contentTemplate key, and not a template key.
     */
    contentTemplate: null,
    // ...
});

而註解也解釋了為什麼要這麼做

(TOEIC 87分翻譯,請多多包涵與指教)

The action mixin assumes that it is rendered with the 'Action' template.
-> Action mixin 已經預設渲染模板 'Action'

This template has a special zone ('.o_content') where the content should be added. 
-> 這個模板有定義特別的區域 ('.o_content'),額外定義內容會加入在這個區域以內

Actions that want to automatically render a template there should define the contentTemplate key. 
-> Actions 會自動渲染 template 的定義,所以若需要自定義模板,則需要定義 'contentTemplate' 屬性

In short, client actions should probably define a contentTemplate key, and not a template key.
-> 簡單來說,Client actions 若需要自定義模板,則定義在 'contentTemplate' 屬性,而不是 'template' 屬性

所以就能清楚 client action view 跟 field widget 的在模板套用上的差異

當然也可以直接覆蓋 templaterenderElement() 自己寫一套流程

但就看各位接到需求了


上一篇
Day 22 實作 10: 建立 action client view - 增加事件(上)
下一篇
Day 24 實作 10: 建立 action client view - 增加事件(下)
系列文
Odoo 14 Javascript 開發心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言